/*
 * iterador.c
 *
 *  Created on: 05/09/2011
 *      Author: guido
 */

#include "iterador.h"
#include <string.h>
#include <stdlib.h>
#include "usuario.h"

void It_init(Iterador* it, struct Lista* l) {
	it->lista = l;
	it->nodoActual = l->raiz;
}

struct Usuario* It_get(Iterador* it) {
	return (it->nodoActual->usuario);
}

int It_tieneSiguiente(Iterador* it) {
	return (it->nodoActual != NULL);
}

struct Usuario* It_siguiente(Iterador* it) {
	struct Usuario* usuario = it->nodoActual->usuario;
	it->nodoActual = it->nodoActual->nodoSiguiente;
	return usuario;
}


/* Remover debe eliminar el nodo actual de la iteracion. Para hacerlo
 * debe apuntar el nodo anterior a actual al nodo siguiente de actual
 * Por eso recorre desde el comienzo de la lista hasta encontrar ese
 * anterior. Dependiendo de si encuentre o no, remueve el nodo */
struct Usuario* It_remover(Iterador* it) {
	Nodo* anterior = NULL;
	Nodo* actual = it->lista->raiz;
	Nodo* nodoARemover = NULL;
	int encontrado = 0;
	if (It_tieneSiguiente(it)) {
		char* numeroARemover = it->nodoActual->usuario->numero;
		if (it->lista->raiz != NULL) {
			while ((!encontrado) && (actual != NULL)) {
				char* numero = actual->usuario->numero;
				if (strcmp(numeroARemover, numero) == 0) {
					encontrado = 1;
					nodoARemover = actual;
					it->nodoActual = actual->nodoSiguiente;
				} else
					anterior = actual;
				actual = actual->nodoSiguiente;
			}
		}
	}
	struct Usuario* usuario = NULL;
	if (encontrado) {
		if (anterior == NULL
		)
			it->lista->raiz = nodoARemover->nodoSiguiente;
		else
			anterior->nodoSiguiente = nodoARemover->nodoSiguiente;
		usuario = nodoARemover->usuario;
		free(nodoARemover);
	}

	return usuario;
}
